package com.woniuxy.util;

import com.nimbusds.jose.*;
import com.nimbusds.jose.crypto.MACSigner;
import com.nimbusds.jose.crypto.MACVerifier;
import java.util.Map;

/**
 * @author ：CuiYC
 * @description：
 * @date ：Created in 2025/3/10 16:07
 * @modified By：
 */
public class JWTUtil {
    private static String SECRETKEY = "天王盖地虎，宝塔镇河妖";//密钥
    /**
     * 创建JWT
     */
    public static String createJWT(Map userMap) throws JOSEException {
        /**
         * 创建jwt
         *      创建头部
         *      创建负载
         *
         * 加密算法
         *      可逆
         *      不可逆
         *      对称：只有一个密钥
         *      非对称：一个密钥，一个公钥。
         */
        //1.创建头部(加密方式，常量）
        JWSHeader header = new JWSHeader.Builder(JWSAlgorithm.HS256)//加密算法（对称加密）
                .type(JOSEObjectType.JWT).build();//常量
        //2.创建载荷（用户名，密码）
//        HashMap<String, Object> hashMap = new HashMap<>();
//        hashMap.put("id",1);
//        hashMap.put("username","laoma");
        Payload payload = new Payload(userMap);

        //3.创建签名 = （头部，载荷，密钥）加密
        JWSObject jwsObject = new JWSObject(header, payload);
        JWSSigner jwsSigner = new MACSigner(SECRETKEY);
        jwsObject.sign(jwsSigner);//加密方法

        return jwsObject.serialize();//使用序列化 -> 生成jwt字符串
    }

    //解密jwt
    public static Boolean verifyJWT(String jwt) throws Exception {
        //可以使用反序列化，把jwt字符串还原成JWSObject对象
        JWSObject jwsObject = JWSObject.parse(jwt); //反序列化方法
        JWSVerifier verifier = new MACVerifier(SECRETKEY);
        return jwsObject.verify(verifier); //解密方法
    }

    //得到jwt里的用户ID
    public static Integer getUserId(String jwt) throws Exception {
        JWSObject jwsObject = JWSObject.parse(jwt); //反序列化方法
        Map<String, Object> userMap = jwsObject.getPayload().toJSONObject(); //得到用户信息
        Long userId = (Long) userMap.get("id");
        return userId.intValue(); //得到用户ID
    }
}
